#import "NSDate+X.h"

@implementation NSDate (X)


/**
 * 根据指定的年、月、日，计算出星期几
 * 使用基姆拉尔森计算公式：W = (d + 2 * m + 3 * (m + 1) / 5 + y + y / 4 - y / 100 + y / 400 + 1) % 7
 * @param   year            NSInteger 类型，年份
 * @param   month           NSInteger 类型，月份
 * @param   day             NSInteger 类型，日期
 * @result                  NSInteger 类型，星期
 */
- (NSInteger)weekForDay:(NSInteger)day ofMonth:(NSInteger)month inYear:(NSInteger)year {
    // 计算
    NSInteger d = day;
    NSInteger m = month;
    NSInteger y = year;
    // 1、2月份要看成是上一年的13、14月份 例如2014-01-10 要看成2013-13-10
    if (m == 1 || m == 2) {
        m+=12;
        y--;
    }
    NSInteger W = (d + 2 * m + 3 * (m + 1) / 5 + y + y / 4 - y / 100 + y / 400 + 1) % 7;
    return W;
}


/**
 * 输出指定格式的日期字符串
 * @param       format，DateFormatEnum 中定义好的格式
 * @result      返回 UIImage，对象
 
 
 FmtDate,                    // 2013年12月04日
 FmtDateShort,               // 12月04日
 FmtDateEn,                  // 2013-12-04
 FmtDateShortEn,             // 12-04
 FmtWeek,                    // 星期一
 FmtWeekShort,               // 周一
 FmtWeekEn,                  // Monday
 FmtWeekShortEn,             // Mon
 FmtTime                     // 23:59
 
 */
- (NSString *)descriptionOfFormatType:(DateFormatEnum)format {
    NSString *strDesc = [self description];
    NSDateFormatter *dateFmt = [[NSDateFormatter alloc] init];
    switch (format) {
        case FmtDate: {     // 2013年12月04日
            [dateFmt setDateFormat:@"yyyy年MM月dd日"];
            strDesc = [dateFmt stringFromDate:self];
            break;
        }
        case FmtDateShort: {     // 12月04日
            [dateFmt setDateFormat:@"MM月dd日"];
            strDesc = [dateFmt stringFromDate:self];
            break;
        }
        case FmtDateEn: {     // 2013-12-04
            [dateFmt setDateFormat:@"yyyy-MM-dd"];
            strDesc = [dateFmt stringFromDate:self];
            break;
        }
        case FmtDateDescEn: {
            [dateFmt setDateFormat:@"dd/MM/yyyy"];
            strDesc = [dateFmt stringFromDate:self];
            break;
        }
        case FmtDateTimeDescEn: {
            [dateFmt setDateFormat:@"yyyy-MM-dd HH:mm:ss"];
            strDesc = [dateFmt stringFromDate:self];
            break;
        }
        case FmtDateShortEn: {     // 12-04
            [dateFmt setDateFormat:@"MM-dd"];
            strDesc = [dateFmt stringFromDate:self];
            break;
        }
        case FmtWeek:
        case FmtWeekShort:
        case FmtWeekEn:
        case FmtWeekShortEn: {
            [dateFmt setDateFormat:@"yyyy-MM-dd"];
            NSString *strDate = [dateFmt stringFromDate:self];
            NSArray *arrDate = [strDate componentsSeparatedByString:@"-"];
            NSInteger nWeek = [self weekForDay:[[arrDate objectAtIndex:2] integerValue]
                                       ofMonth:[[arrDate objectAtIndex:1] integerValue]
                                        inYear:[[arrDate objectAtIndex:0] integerValue]];
            NSArray *arrWeek = nil;
            if (FmtWeek == format) {        // 星期一
                arrWeek = [NSArray arrayWithObjects:@"星期日", @"星期一", @"星期二", @"星期三", @"星期四", @"星期五", @"星期六", nil];
            }
            else if (FmtWeek == format) {   // 周一
                arrWeek = [NSArray arrayWithObjects:@"周日", @"周一", @"周二", @"周三", @"周四", @"周五", @"周六", nil];
            }
            else if (FmtWeek == format) {   // Monday
                arrWeek = [NSArray arrayWithObjects:@"Sunday", @"Monday", @"Tuesday", @"Wednesday", @"Thursday", @"Friday", @"Saturday", nil];
            }
            else if (FmtWeek == format) {   // Mon
                arrWeek = [NSArray arrayWithObjects:@"Mon", @"Mon", @"Tue", @"Wed", @"Thu", @"Fri", @"Sat", nil];
            }
            
            if (arrWeek) {
                strDesc = [arrWeek objectAtIndex:nWeek];
            }
            else {
                strDesc = @"";
            }
            break;
        }
        case FmtTime: {     // 23:59
            [dateFmt setDateFormat:@"HH:mm"];
            strDesc = [dateFmt stringFromDate:self];
            break;
        }
        default:
            break;
    }
    
    return strDesc;
}


@end
